Soru & Cevap

Arkaplan Serviste LocationListener Kullanımı

03.02.2015 - 09:27

Merhaba gelistirmek istedigim uygulamamda belirli zaman aralıgında arka planda aldıgım kordinatları uzak sunucuma post etmek istiyorum fakat Servis kısmında aşagıdaki hatayı alıyorum.

Can't create handler inside thread that has not called Looper.prepare()

Uygulama locationManager. requestlocationupdates metodunda olusuyor problem. Servisim extends Service implements LocationListener olarak tanımladım gerekli islemleri yapıyorum sorun nerede anlamadım yardımcı olursanız sevinirim

 

[code]

public class CoordinateService extends Service implements LocationListener {

//Gerekli değişkenlerim vb.

//Servis Methodum

@Override
    public void onCreate() {

       super.onCreate();

        timer = new Timer();
        handler = new Handler(Looper.getMainLooper());

        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {

                getLocation();

               // Yukardaki methodtan sonra asynctask ile verileri post ediyorum.

            }
        }, 0, 60 * 2000);
    }

//Location değişkenimi set ettiğim method'um

public Location getLocation() {
        try {
            locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);

            // getting GPS status
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // getting network status
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                this.canGetLocation = true;
                // First get location from Network Provider
                if (isNetworkEnabled) {
              locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES,this);

                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Enabled", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return location;
    }

}

 

 

[/code]

61 Görüntülenme

3 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-7617-1421911538.jpg
sametgunduz
04.02.2015 - 04:11

Problem Muzaffer beyinde bahsettiği gibi timer dan kaynaklanıyor, konumun update etme metodunu timerın üzerinde çalıştırabilirsiniz, yanlız şunuda belirtmekte fayda var, eğer timer ın üzerinde işlemi başlatırsanız konum ile ilgili olarak yapılan değişikliklerde örneğin ilk çalıştığı anda gps kapalıdır telefon network üzerinden kordinat günceller daha snra kullanıcı gps i aktif etsede telefon network üzerinden güncelleme yapmaya devam edicektir. bunu için listener'ın, onProviderEnabled ve onProviderDisabled methodlarında tekrar ilgili provider ı vererek requestLocationUpdates ı çağırmalısınız.

Türkeş Efe
04.02.2015 - 04:13
teşekkürler
picture-1372-1408467635.jpg
ahmtbrk
03.02.2015 - 11:12

Location yakaladığın yerde ui için bir işlem vs mi yapıyorsun.

onLocationChanged methodu içerisinde ne var koyabilir misin buraya?

Türkeş Efe
04.02.2015 - 09:12
ui ile ilgili hiç bir işlem yok. yapmak istediğim en sağlıklı kordinatı alıp arka planda sunucuma göndermek. Soruyu güncelledim.
picture-29479-1488215481.jpg
muzafferdaghan
03.02.2015 - 10:35

Merhaba. İzlediğiniz yol doğru. LocationListener'i bir service'e implemente ederek thread ile veriyi almak izlenebilecek en doğru yollardan biri. Ancak hatada belirtildiği gibi Handler'i thread içinde oluşturamazsınız. Onun yerine handler'i thread dışında oluşturmalısınız. Ayrıca LocationListener ile almak istediğiniz location'in provider'i eğer GPS olacaksa GPS'i bir boradcast ile aktif hale getirmelisiniz.Ancak bunun için Manifest'e bazı user permission'ları dahil etmeniz gerekir. Bununla birlikte API 17'den itibaren bazı cihazlar GPS'in broadcast ile user tarafından çalıştırılmasını bug olarak algılamakta ve bu durum zaman zaman uygulamanın crash olmasına sebep olmaktadır.

Türkeş Efe
04.02.2015 - 09:14
Muzaffer Bey, yukarıda kod paylaşımında da bulundum. İstediğim şeyi en sağlıklı şekilde nasıl geliştirebilirim yardımcı olurmusunuz ?